﻿// Wireless Network POJ - 2236.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>

using namespace std;
//https://vjudge.csgrandeur.cn/problem/POJ-2236

/*
东南亚发生了地震。ACM（亚洲合作医疗队）用膝上型计算机建立了一个无线网络，但一场突如其来的余震袭击了网络，网络中的所有计算机全部被震坏。
电脑被逐一修复，网络逐渐恢复正常。由于硬件限制，每台计算机只能与距离它不超过 d 米的计算机直接通信。
但每台计算机都可以被视为其他两台计算机之间通信的中介，也就是说，如果计算机 A 和计算机 B 可以直接通信，或者有一台计算机 C 可以同时与计算机 A 和计算机 B 通信，
那么计算机 A 和计算机 B 就可以通信。

在修复网络的过程中，工人们每时每刻都在进行两种操作，一种是修复计算机，另一种是测试两台计算机是否可以通信。你的任务是回答所有测试操作。
输入

第一行包含两个整数 N 和 d（1 <= N <= 1001，0 <= d <= 20000）。N 是计算机的数量，从 1 到 N，D 是两台计算机直接通信的最大距离。
在接下来的 N 行中，每行包含两个整数 xi、yi（0 <= xi，yi <= 10000），即 N 台计算机的坐标。从第 (N+1)- 行开始到输入结束，将逐一进行操作。
每一行都包含以下两种格式之一的操作：

1. "O p"（1 <= p <= N），表示修复计算机 p。
2. "S p q"（1 <= p，q <= N），表示测试计算机 p 和 q 是否能通信。

输入不会超过 300000 行。

输出

对于每个测试操作，如果两台计算机可以通信，则打印 "SUCCESS"（成功）；如果不能通信，则打印 "FAIL"（失败）。
输入示例

4 1
0 1
0 2
0 3
0 4
O 1
O 2
O 4
S 1 4
O 3
S 1 4

样品输出
FAIL
SUCCESS
*/

int n, d;
const int N = 1010;
struct NODE {
	int x, y;
}nodes[N];

int f[N];

void init() {
	for (int i = 0; i < N; i++) { f[i] = i+N+10; }
}

int find(int x) {
	if (x != f[x]) f[x] = find(f[x]);
	return f[x];
}

void merge(int a, int b) {
	a = find(a); b = find(b);
	if (a < b) {
		f[b] = a;
	}
	else {
		f[a] = b;
	}
}


bool check(int a, int b) {
	int x1 = nodes[a].x; int y1 = nodes[a].y;
	int x2 = nodes[b].x; int y2 = nodes[b].y;

	return  ((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) <= d * d;
}


int main()
{
	cin >> n >> d;
	init();
	for (int i = 1; i <= n; i++) {
		cin >> nodes[i].x >> nodes[i].y;
	}
	string op;
	while (cin >> op) {
		if (op[0] == 'O') {
			int t; cin >> t;
			if (f[t] > N) f[t] = t;
			for (int i = 1; i <= n; i++) {
				if (f[i] < N && i != t && check(t, i)) {
					merge(i, t);
				}
			}
		}
		else {
			int a, b; cin >> a >> b;
			if (f[a] > N || f[b] > N) {
				cout << "FAIL" << endl; continue;
			}
			a = find(a); b = find(b);
			if (a == b) {
				cout << "SUCCESS" << endl;
			}
			else {
				cout << "FAIL" << endl;
			}
		}

	}


	return 0;
}

 